package com.cqc.other.juc.volatil.demo1;

import java.util.concurrent.TimeUnit;

/**
 * https://pzblog.cn/java/concurrent/concurrent-volatile.html
 * Thread线程之间数据是不可见的，因为每个线程都有自己的共享变量副本。
 * volatile可以把 线程的共享变量副本 的值 赋给 主内存的共享变量，达到多线程 看到的变量是相同的。
 */
public class VolatileTest {
    /**
     * 说明被volatile修饰的变量，在多线程环境下，可以保证所有线程看到这个变量都是同一个值
     * 如果不加volatile关键字,private  boolean flag = true;运行后我们发现卡住了。因为main线程改了 DataEntity.flag的值，但是AThread线程看不到新值
     * 如果加volatile关键字,private volatile boolean flag = true;因为main线程改了 DataEntity.flag的值，主内存的共享变量也就是最新值，AThread线程就可以看到新值
     */
    public static void main(String[] args) throws InterruptedException {
        DataEntity dataEntity = new DataEntity();
        AThread aThread = new AThread(dataEntity);
        aThread.start();

        TimeUnit.SECONDS.sleep(1);
        dataEntity.setFlag(false);
    }
}
